package nl.hanze.shoestring.logic;

import java.util.Date;
import java.util.List;
import nl.hanze.shoestring.dao.DAOFacade;
import nl.hanze.shoestring.domain.*;

/**
 *
 * @author bleker
 */
public class Logic {

    DAOFacade facade;

    public Logic(DAOFacade facade) {
        this.facade = facade;
    }
    // continent

    public List<Continent> getContinentList() {
        return facade.getContinentDAO().getAll();
    }

    public void updateContinent(Continent continentObj) {
        facade.getContinentDAO().update(continentObj);
    }

    public void addContinent(Continent continentObj) {
        facade.getContinentDAO().add(continentObj);
    }

    public void deleteContinent(Continent continentObj) {
        facade.getContinentDAO().delete(continentObj);
    }
    // Deelnemer

    public List<Deelnemer> getDeelnemerList() {
        return facade.getDeelnemerDAO().getAll();
    }

    public List<Deelnemer> getDeelnemerByKlantId(int klantId) {
        return facade.getDeelnemerDAO().findByKlantId(klantId);
    }

    public void updateDeelnemer(Deelnemer deelnemerObj) {
        facade.getDeelnemerDAO().update(deelnemerObj);
    }

    public void addDeelnemer(Deelnemer deelnemerObj) {
        facade.getDeelnemerDAO().add(deelnemerObj);
    }

    public void deleteDeelnemer(Deelnemer deelnemerObj) {
        facade.getDeelnemerDAO().delete(deelnemerObj);
    }
    // groepskorting

    public List<Groepskorting> getGroepskortingList() {
        return facade.getGroepskortingDAO().getAll();
    }

    public List<Reservering> searchReservering(String name, Date startDate, Date endDate) {
        return facade.getReserveringDAO().find(name, startDate, endDate);
    }

    public boolean updateGroepskorting(Groepskorting kortingObj) {
        if (Rules.checkKortingPercentage(kortingObj)) {
            facade.getGroepskortingDAO().update(kortingObj);
            return true;
        } else {
            return false;
        }
    }

    public boolean addGroepskorting(Groepskorting kortingObj) {
        if (Rules.checkKortingPercentage(kortingObj)) {
            facade.getGroepskortingDAO().add(kortingObj);
            return true;
        } else {
            return false;
        }

    }

    public void deleteGroepskorting(Groepskorting kortingObj) {
        facade.getGroepskortingDAO().delete(kortingObj);
    }
    // klant

    public List<Klant> getKlantList() {
        return facade.getKlantDAO().getAll();
    }

    public void updateKlant(Klant klantObj) {
        facade.getKlantDAO().update(klantObj);
    }

    public void addKlant(Klant klantObj) {
        facade.getKlantDAO().add(klantObj);
    }

    public void deleteKlant(Klant klantObj) {
        facade.getKlantDAO().delete(klantObj);
    }

    public List<Klant> searchKlant(String name) {
        return facade.getKlantDAO().find(name);
    }
    // land

    public List<Land> getLandList() {
        return facade.getLandDAO().getAll();
    }

    public void updateLand(Land landObj) {
        facade.getLandDAO().update(landObj);
    }

    public void addLand(Land landObj) {
        facade.getLandDAO().add(landObj);
    }

    public void deleteLand(Land landObj) {
        facade.getLandDAO().delete(landObj);
    }

    public List<Land> searchLand(String name) {
        return facade.getLandDAO().find(name);
    }
    // medewerker

    public List<Medewerker> getMedewerkerList() {
        return facade.getMedewerkerDAO().getAll();
    }

    public List<Medewerker> getMedewerkerList(Boolean isGids) {
        return facade.getMedewerkerDAO().findByGids(isGids);
    }

    public void updateMedewerker(Medewerker medewerkerObj) {
        facade.getMedewerkerDAO().update(medewerkerObj);
    }

    public void addMedewerker(Medewerker medewerkerObj) {
        facade.getMedewerkerDAO().add(medewerkerObj);
    }

    public void deleteMedewerker(Medewerker medewerkerObj) {
        facade.getMedewerkerDAO().delete(medewerkerObj);
    }

    public List<Medewerker> searchMedewerker(String name) {
        return facade.getMedewerkerDAO().find(name);
    }
    // persoon

    public List<Persoon> getPersoonList() {
        return facade.getPersoonDAO().getAll();
    }

    public void updatePersoon(Persoon persoonObj) {
        facade.getPersoonDAO().update(persoonObj);
    }

    public void addPersoon(Persoon persoonObj) {
        facade.getPersoonDAO().add(persoonObj);
    }

    public void deletePersoon(Persoon persoonObj) {
        facade.getPersoonDAO().delete(persoonObj);
    }

    public List<Persoon> searchPersoon(String name) {
        return facade.getPersoonDAO().find(name);
    }
    // planning

    public List<Planning> getPlanningList() {
        return facade.getPlanningDAO().getAll();
    }

    public void updatePlanning(Planning planningObj) {
        facade.getPlanningDAO().update(planningObj);
    }

    public void addPlanning(Planning planningObj) {
        facade.getPlanningDAO().add(planningObj);
    }

    public void deletePlanning(Planning planningObj) {
        facade.getPlanningDAO().delete(planningObj);
    }

    public List<Planning> searchPlanning(String name, Date startDate, Date endDate) {
        return facade.getPlanningDAO().find(name, startDate, endDate);
    }
    // reis

    public List<Reis> getReisList() {
        return facade.getReisDAO().getAll();
    }

    public void updateReis(Reis reisObj) {
        facade.getReisDAO().update(reisObj);
    }

    public void addReis(Reis reisObj) {
        facade.getReisDAO().add(reisObj);
    }

    public void deleteReis(Reis reisObj) {
        facade.getReisDAO().delete(reisObj);
    }

    public List<Reis> searchReis(String name) {
        return facade.getReisDAO().find(name);
    }
    // reistype

    public List<Reistype> getReistypeList() {
        return facade.getReistypeDAO().getAll();
    }

    public void updateReistype(Reistype reistypeObj) {
        facade.getReistypeDAO().update(reistypeObj);
    }

    public void addReistype(Reistype reistypeObj) {
        facade.getReistypeDAO().add(reistypeObj);
    }

    public void deleteReistype(Reistype reistypeObj) {
        facade.getReistypeDAO().delete(reistypeObj);
    }
    // reservering

    public List<Reservering> getReserveringList() {
        return facade.getReserveringDAO().getAll();
    }

    public void updateReservering(Reservering resObj) {
        facade.getReserveringDAO().update(resObj);
    }

    public void addReservering(Reservering resObj) {
        facade.getReserveringDAO().add(resObj);
    }

    public void deleteReservering(Reservering resObj) {
        facade.getReserveringDAO().delete(resObj);
    }

    public void berekenReisPrijs(Reservering reservering) {
        List<Deelnemer> deelnemers = reservering.getDeelnemerList();
        int numDeelnemers = deelnemers.size();
        float reisPlanningPrijs = reservering.getPlanningId().getBedrag();

        Groepskorting korting = facade.getGroepskortingDAO().getKortingByDeelnemers(numDeelnemers);
        float reisPrijs = reisPlanningPrijs * (1 - (korting.getKorting() / 100));


        for (Deelnemer d : deelnemers) {
            //Bij verlenging wordt 75 euro in rekening gebracht
            //Bij dieet wordt 50 euro in rekening gebracht
            if (d.getVerlenging() && d.getDieet()) {
                d.setBedrag(reisPrijs + 75 + 50);
            } else if (d.getVerlenging()) {
                d.setBedrag(reisPrijs + 75);
            } else if (d.getDieet()) {
                d.setBedrag(reisPrijs + 50);
            } else {
                d.setBedrag(reisPrijs);
            }

            //Schrijf de aanpassing naar DB
            facade.getDeelnemerDAO().update(d);
        }
    }

    public float getTotaleReisPrijs(Reservering reservering) {
        List<Deelnemer> deelnemers = reservering.getDeelnemerList();
        float totaleReisPrijs = 0;

        for (Deelnemer d : deelnemers) {
            totaleReisPrijs += d.getBedrag();
        }

        return totaleReisPrijs;
    }

    public int getAantalDeelnemers(Reservering res) {
        List<Reservering> resveringen = res.getPlanningId().getReserveringList();
        int aantalDeelnemers = 0;

        for (Reservering reservering : resveringen) {
            if (reservering.getDatumAnnulering() == null) {
                aantalDeelnemers += reservering.getDeelnemerList().size();
            }
        }

        return aantalDeelnemers;
    }
}
